package effectiveJava;

import java.util.Map;

/**
 * Created by dycong on 2017/9/2.
 * todo 提供接口骨架类
 */
public abstract class SkeletalInterface<K, V> implements Map.Entry<K, V> {
    // TODO: 2017/9/2 1. 确定接口的哪些方法是基本的，其他方法可以根据他们来实现，这些基本方法将成为骨架类中的抽象方法
    // TODO: 2017/9/2 必须为接口中的所有其他方法提供具体的实现
    public abstract K getKey();

    public abstract V getValue();

    @Override
    public V setValue(V value) {
        throw new UnsupportedOperationException();
    }

    @Override
    public boolean equals(Object o) {
        if (this==o){
            return true;
        }
        if (o instanceof Map.Entry){
            Map.Entry<K,V> arg=(Map.Entry<K,V>)o;
            return equals(getKey(),arg.getKey())&&equals(getValue(),arg.getValue());
        }
        return false;
    }

    private static boolean equals(Object o1,Object o2){
        /*todo o1,o2同时为null返回true */
        return o1==null?o2==null:o1.equals(o2);
    }

    @Override
    public int hashCode() {
        return hashCode(getKey()) ^ hashCode(getValue());
    }

    private static int hashCode(Object o) {
        return o == null ? 0 : o.hashCode();
    }

}
